import re
from functools import partial
from utils.title_level.title_re import no_rules_regex


# 设置相应标题的变量，用于后续处理
no_relu_title_path = 'src/utils/title_level/no_relu_title.txt'
## 一级以外的标题规则存储
get_title_patterns = []
add_title_patterns = []
## 一级的标题规则存储
first_level_pattern = r'()'
keywords = []
no_relu_pattern = r''


start_idx = 0
# 获取文档标题等级
def get_title_level(file_contents, title_patterns):
    """
    根据给定的标题匹配模式，计算每个标题的层级（根据在文档中的位置）。

    Args:
        file_contents (str): 输入的文件内容。
        title_patterns (list): 一个包含标题匹配模式的列表，按顺序定义标题的优先级。

    Returns:
        list: 每个标题的层级，按 `title_patterns` 的顺序返回。
    """
    title_idx = [-1]*len(title_patterns)
    title_level = [-1]*len(title_patterns)
    # 获取每个标题在文章中的第一个索引
    for i in range(len(title_patterns)):
        title_pattern = title_patterns[i]
        first_title = re.search(title_pattern, file_contents)
        if first_title:
            title_idx[i] = first_title.start()
    # 根据索引的前后，标注标题的等级
    ## 索引排序
    title_idx_sort = sorted(title_idx)
    ## 标注等级
    count_negative_one = title_idx.count(-1)
    for i in range(len(title_patterns)):
        if title_idx[i] != -1:
            title_level[i] = title_idx_sort.index(title_idx[i]) + 1 + 1 - count_negative_one
    return title_level



# 添加标题等级
def add_title_level(match, md_content):
    """
    根据匹配的标题级别，修改 Markdown 内容中的标题格式。

    Args:
        match (MatchObject): 正则表达式的匹配对象。
        md_content (str): 原始的 Markdown 内容。

    Returns:
        str: 修改后的标题内容，带有正确的标题层级。
    """
    # print(match)
    global start_idx
    md_content = md_content[start_idx:]
    # 获取标题等级
    title_level = get_title_level(md_content, get_title_patterns)
    # 删除match中的#、\n、空格等符号
    match_str = match.group(0)
    match_str = re.sub(r'[#\n\s]', '', match_str)

    # 一级标题处理
    ## 文件名：后续看情况判断是否补充
    ## 规则匹配
    if re.search(first_level_pattern, match_str):
        match_str = re.sub(first_level_pattern, r'# \1', match_str)
        start_idx = match.start()
        md_content = md_content[start_idx:]
        # 获取标题等级
        title_level = get_title_level(md_content, get_title_patterns)
    ## 不规则的字符匹配
    elif match_str in keywords:
        # match_str = re.sub(pattern, r'# \1', match_str)  # 替换匹配的部分
        match_str = '# ' + match_str
        start_idx = match.start()
        md_content = md_content[start_idx:]
        # 获取标题等级
        title_level = get_title_level(md_content, get_title_patterns)
    ## 不规则的正则匹配
    elif no_relu_pattern and re.search(no_relu_pattern, match_str):
        match_str = re.sub(no_relu_pattern, r'# \1', match_str)
        start_idx = match.start()
        md_content = md_content[start_idx:]
        # 获取标题等级
        title_level = get_title_level(md_content, get_title_patterns)

    # 其余标题匹配
    other_title_patterns2level = [(x,y) for x,y in zip(title_level, add_title_patterns) if x != -1]
    for level, pattern in other_title_patterns2level:
        match_str = re.sub(pattern, r'#'*level + r' \1', match_str)
    return '\n' + match_str + '\n'
def title_change(md_content, title_dict, first_level,no_relu_database:bool=False):
    """
    修改 Markdown 内容中的标题，根据提供的标题字典进行替换。

    Args:
        md_content (str): 输入的 Markdown 内容。
        title_dict (dict): 包含标题和相应级别的字典，用于标题匹配。
        first_level (str): 一级标题的匹配规则。
        no_relu_database (bool): 是否使用数据库规则匹配，默认为 False。

    Returns:
        str: 修改后的 Markdown 内容。
    """
    # 初始化变量：用于存储标题匹配模式、额外标题模式和无规则标题的关键词
    global get_title_patterns, add_title_patterns, first_level_pattern,keywords,no_relu_pattern
    # 重置全局变量
    get_title_patterns = []
    add_title_patterns = []
    keywords = []
    first_level_pattern = r'('+first_level+r')' # 一级标题匹配模式
     # 遍历 title_dict，构建匹配规则和标题模式：非一级标题
    for pattern, value in title_dict.items():
        if value['level'] == 0:
            get_title_patterns.append(r'\n#\s*'+pattern[1:]+r'.*?\n')
            add_title_patterns.append(r'('+pattern+r')')
    
    # 处理无规则标题（level == -1），根据 no_relu_database 的值来决定处理方式
    for pattern, value in title_dict.items():
        if value['level'] == -1:
            if no_relu_database:
                keywords.append(pattern)
            else:
                with open(no_relu_title_path, 'r', encoding='utf-8') as f:
                    no_relu_content = f.read()
                    if pattern in no_relu_content:
                        keywords.append(pattern)
                    else:
                        for no_rule_regex in no_rules_regex:
                            if re.search(no_rule_regex["pattern"],pattern):
                                no_relu_pattern = r'('+no_rule_regex["pattern"]+r')'
                                break
    # print(add_title_patterns)
    # print(get_title_patterns)
    # 更改标题
    ## 使用 functools.partial 将 title_level 作为参数传递
    add_title_level_with_level = partial(add_title_level, md_content=md_content)
    md_context = re.sub(r'\n#([^#\n]*?\n)',add_title_level_with_level, md_content)
    return md_context
